home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
376-400
/
disk_386
/
xlispstat
/
src2.lzh
/
XLisp-Stat
/
derivatives.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-10-02
|
2KB
|
79 lines
/* derivatives - for Bayes code in XLISP-STAT and S */
/* XLISP-STAT 2.1 Copyright (c) 1990, by Luke Tierney */
/* Additions to Xlisp 2.1, Copyright (c) 1989 by David Michael Betz */
/* You may give out copies of this software; for conditions see the */
/* file COPYING included with this distribution. */
#include "xlisp.h"
#include "osdef.h"
#ifdef ANSI
#include "xlsproto.h"
#else
#include "xlsfun.h"
#endif ANSI
# define nil 0L
# define FALSE 0
# define TRUE 1
void numergrad(n, x, grad, fsum, ffun, h, typx)
int n;
RVector x, grad, fsum, typx;
#ifdef ANSI
int (*ffun)(RVector,double *,int,int);
#else
int (*ffun)();
#endif ANSI
double h;
{
int i;
double old_xi, f1, f2, hi;
for (i = 0; i < n; i++) {
old_xi = x[i];
hi = (typx != nil) ? typx[i] * h : h;
x[i] = old_xi + hi;
(*ffun)(x, &f1, nil, nil);
x[i] = old_xi - hi;
(*ffun)(x, &f2, nil, nil);
x[i] = old_xi;
grad[i] = (f1 - f2) / (2.0 * hi);
fsum[i] = f1 + f2;
}
}
void numerhess(n, x, hess, f, fsum, ffun, h, typx)
int n;
RVector x, fsum, typx;
RMatrix hess;
#ifdef ANSI
int (*ffun)(RVector,double *,int,int);
#else
int (*ffun)();
#endif ANSI
double h, f;
{
int i, j;
double old_xi, old_xj, f1, f2, hi, hj;
for (i = 0; i < n; i++) {
hi = (typx != nil) ? typx[i] * h : h;
hess[i][i] = (fsum[i] - 2 * f) / (hi * hi);
for (j = i + 1; j < n; j++) {
hj = (typx != nil) ? typx[j] * h : h;
old_xi = x[i];
old_xj = x[j];
x[i] = old_xi + hi;
x[j] = old_xj + hj;
(*ffun)(x, &f1, nil, nil);
x[i] = old_xi - hi;
x[j] = old_xj - hj;
(*ffun)(x, &f2, nil, nil);
x[i] = old_xi;
x[j] = old_xj;
hess[i][j] = (2 * f + f1 + f2 - fsum[i] - fsum[j]) / (2.0 * hi * hj);
hess[j][i] = hess[i][j];
}
}
}